package cn.tedu.design;

/**
 * @author :Colin
 * @version 创建时间: 2021/6/24 10:31
 * 本类由于测试单例设计模式实现方案二：懒汉式--面试重点!!
 */
public class Singleton2 {
    public static void main(String[] args) {
        MySingle2 s1 =MySingle2.getSingle2();
        MySingle2 s2 =MySingle2.getSingle2();
        System.out.println(s1 == s2);
        System.out.println(s1);
        System.out.println(s2);

    }

}
/*问题：程序中有共享资源single2，并且有多条语句操作了共享资源
所以single2再多线程环境下会有数据安全隐患的
解决方案1：同步代码块【加锁，范围是操作共享资源的所有代码 】
解决方案2：同步方法
【如果一个方法中的所有代码均需要被同不，那我们可以把这个方法设置为同步方法】
注意：锁对象再静态方法中不能设置成this，因为静态资源优先于对象进行加载
锁对象可以外部创建好的唯一的锁对象， 但注意o也需要设置为静态
因为静态只能调用静态 */
class MySingle2{
    private MySingle2(){
    }
    static Object o = new Object();

    //本类内部先定义一个对象类型的引用类型变量
    private static MySingle2 single2;//定义引用类型变量，默认值是null
    synchronized static public MySingle2 getSingle2(){
        synchronized (o){}
        if (single2 == null){
           single2 = new MySingle2();
        }
            return single2;
        }
}
